#ifndef SUBSCRIPTION_H
#define SUBSCRIPTION_H

/**
 * @file subscription.h
 * @brief Subscription 类的声明，封装订阅生命周期管理。
 *
 * 使用 RAII 思想，在对象析构或调用 Reset() 时自动退订。
 */

#include <cstddef>
#include <string>

class EventBus;  // 前向声明，避免头文件循环包含。

/**
 * @class Subscription
 * @brief 表示一次订阅操作，可用于手动或自动退订。
 *
 * 禁止拷贝，允许移动。常在 subscribe 函数返回时构造，
 * 用户持有该对象即可管理订阅的生命周期。
 */
class Subscription {
public:
    Subscription() = default;
    Subscription(EventBus* bus, std::string topic, std::size_t id);

    Subscription(const Subscription&) = delete;
    Subscription& operator=(const Subscription&) = delete;

    Subscription(Subscription&& other) noexcept;
    Subscription& operator=(Subscription&& other) noexcept;

    ~Subscription();

    /**
     * @brief 主动退订（若尚未退订），多次调用安全。
     */
    void Reset();

private:
    EventBus* bus_ = nullptr;     ///< 指向所属 EventBus，Reset 时回调。
    std::string topic_;           ///< 订阅的主题名。
    std::size_t id_ = 0;          ///< 在该主题下的订阅唯一 ID。
};

#endif  // SUBSCRIPTION_H